/*
 * Copyright (c) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef HI_APP_BASE_H
#define HI_APP_BASE_H

#include <stdint.h>
#include <stdbool.h>
#include "evt_mon.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
    app base初始化.

    app启动时调用此函数完成对app base的初始化。
    执行此函数的线程将被设置为主线程，此函数将为其创建EvtMon。
    它会将全局配置文件load到内存，user可通过cfg_get_xxx()读取配置。

    @param cfgFilePath[in]: 全局配置文件全路径。
*/
int AppBaseInit(const char* cfgFilePath);

/**
    app base去初始化.

    app退出时应调用此函数完成对app base的去初始化。
    AppBaseInit()中load的全局配置会被释放。
*/
void AppBaseExit(void);

/**
    启动watchdog.

    可以设置watchdogTimeout来启动watchdog timer。当timer到期后，若进程还未终止，
    说明程序有bug，不能正常退出，此时app base会exit进程。

    @param watchdogTimeout[in]:
        0表示不启动watchdog，
        >0表示启动，其值为timeout(ms)，
        <0表示启动，timeout为默认值.
 */
void StartAppWd(long watchdogTimeout);

/**
    请求reboot系统.

    它会请求主线程退出事件循环，设置标志，在app_base_exit()时向系统请求reboot系统。

    可以设置@watchdogTimeout来启动watchdog timer。当timer到期后，若进程还未终止，
    说明程序有bug，不能正常退出，此时app base会强行reboot系统。

    @param watchdogTimeout[in]: 参见app_quit_req()中的参数说明。
*/
void RebootSystem(long watchdogTimeout);

/**
    返回主线程ID.
*/
pthread_t MainThrdId(void);

/**
    返回主线程关联的EvtMon.
*/
EvtMon* MainEvtMon(void);

/**
    判断当前线程是否是主线程.
*/
bool IsMainThrd(void);

/**
    获取配置项.

    当@param key不存在时，返回@param defVal.

    @param key[in]: 配置项key，格式为"section:field".
    @param defVal[in]: 配置项默认值。
    @return 返回配置项的值或默认值。
*/
int GetCfgInt(const char* key, int defVal);
double GetCfgDouble(const char* key, double defVal);
bool GetCfgBool(const char* key, bool defVal);
const char* GetCfgStr(const char* key, const char* defVal);

/**
    获取配置项.

    当@param section或@param field不存在时，返回@param defVal.

    @param key[in]: 配置项section.
    @param key[in]: 配置项field.
    @param defVal[in]: 配置项默认值。
    @return 返回配置项的值或默认值。
*/
int SectGetCfgInt(const char* section, const char* field, int defVal);
double SectGetCfgDouble(const char* section, const char* field, double defVal);
bool SectGetCfgBool(const char* section, const char* field, bool defVal);
const char* SectGetCfgStr(const char* section, const char* field, const char* defVal);

#ifdef __cplusplus
}
#endif

#endif // HI_APP_BASE_H
